package dbexp.utils;

import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;

import dbexp.connection.DbStateException;

public enum Error {
	sql,
 error, access_property,
	;
	private static ResourceBundle rb;
	private static final MessageFormat mf = new MessageFormat("");
	private static final Locale locale = Locale.getDefault();
	private static final String MISSING = "missing param: ";
	static{
		refresh();
	}
	/**
	 * Zaczytuje treści komunikatów z pliku error.properties
	 */
	private static void refresh(){
		try{
			rb = ResourceBundle.getBundle("dbexp.utils.error", Locale.getDefault());
		}catch(final Exception e){e.printStackTrace();}
	}
	boolean exists(){
		return (rb != null) && rb.containsKey(name().replaceAll("_", "."));
	}
	/**
	 * Pobiera treść komunikatu dla którego kluczem jest <code>name</code>
	 * @param name klucz komunikatu
	 * @return treść komunikatu lub missing param jeżeli brak treści
	 */
	public static String get(final String name){
		if(!locale.equals(Locale.getDefault())){
			refresh();
		}
		if((rb!=null) && rb.containsKey(name)){
			return rb.getString(name);
		}
		return MISSING + name;
	}
	@Override
	public String toString() {
		return get(name().replaceAll("_", "."));
	}
	/**
	 * Formatuje treść komunikatu według wartości parametrów
	 * @param params parametry dla kumunikatu
	 * @return sformatowana treść komunikatu lub missing param jeżeli brak treści
	 * @see java.text.MessageFormat#format(String, Object...)
	 */
	public String format(final Object... params){
		mf.applyPattern(toString());
		return mf.format(params);
	}
	
	public DbStateException state(){
		return new DbStateException(toString());
	}
	public void throwDbStateException()throws DbStateException{
		throw state();
	}
	/**
	 * Tworzy instancję wyjątku DbStateException z informacją równą sformatowanej treści komunikatu według wartości parametrów
	 * @param params parametry dla kumunikatu
	 * @return DbStateException
	 * @see #format(Object...)
	 */
	public DbStateException state(final Object... params ){
		return new DbStateException(format(params));
	}
	public DbStateException state(final SQLException sqle ){
		return new DbStateException(format(sqle.getErrorCode(), sqle.getMessage()));
	}
	public void throwDbStateException(final Object... params)throws DbStateException{
		throw state(params);
	}
	public void throwDbStateException(final SQLException sqle )throws DbStateException{
		throw state(sqle);
	}
}
